<!DOCTYPE html>
<html>

<head>
  <title>Quarkus - Using SSL With Native Executables</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/guides/native-and-ssl" />
  <meta property="og:title" content="Quarkus - Using SSL With Native Executables" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/guides/native-and-ssl">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="guides">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="active">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="guide">
  <div class="width-12-12">
    <h1 class="text-caps">Quarkus - Using SSL With Native Executables</h1>
    <div class="hide-mobile toc"><ul class="sectlevel1">
<li><a href="#prerequisites">Prerequisites</a></li>
<li><a href="#looks-like-it-works-out-of-the-box">Looks like it works out of the box?!?</a></li>
<li><a href="#lets-disable-ssl-and-see-how-it-goes">Let&#8217;s disable SSL and see how it goes</a></li>
<li><a href="#lets-start-again-with-a-clean-slate">Let&#8217;s start again with a clean slate</a></li>
<li><a href="#the-truststore-path">The TrustStore path</a>
<ul class="sectlevel2">
<li><a href="#working-with-containers">Working with containers</a></li>
</ul>
</li>
<li><a href="#conclusion">Conclusion</a></li>
</ul></div>
    <div>
      <div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>We are quickly moving to an SSL-everywhere world so being able to use SSL is crucial.</p>
</div>
<div class="paragraph">
<p>In this guide, we will discuss how you can get your native executables to support SSL,
as native executables don&#8217;t support it out of the box.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
If you don&#8217;t plan on using native executables, you can pass your way as in JDK mode, SSL is supported without further manipulations.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="prerequisites"><a class="anchor" href="#prerequisites"></a>Prerequisites</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To complete this guide, you need:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>less than 20 minutes</p>
</li>
<li>
<p>an IDE</p>
</li>
<li>
<p>GraalVM installed with <code>JAVA_HOME</code> and <code>GRAALVM_HOME</code> configured appropriately</p>
</li>
<li>
<p>Apache Maven 3.6.2+</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>This guide is based on the REST client guide so you should get this Maven project first.</p>
</div>
<div class="paragraph">
<p>Clone the Git repository: <code>git clone <a href="https://github.com/quarkusio/quarkus-quickstarts.git" class="bare">https://github.com/quarkusio/quarkus-quickstarts.git</a></code>, or download an <a href="https://github.com/quarkusio/quarkus-quickstarts/archive/master.zip">archive</a>.</p>
</div>
<div class="paragraph">
<p>The project is located in the <code>rest-client-quickstart</code> <a href="https://github.com/quarkusio/quarkus-quickstarts/tree/master/rest-client-quickstart">directory</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="looks-like-it-works-out-of-the-box"><a class="anchor" href="#looks-like-it-works-out-of-the-box"></a>Looks like it works out of the box?!?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you open the application&#8217;s configuration file (<code>src/main/resources/application.properties</code>), you can see the following line:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">org.acme.restclient.CountriesService/mp-rest/url=https://restcountries.eu/rest</code></pre>
</div>
</div>
<div class="paragraph">
<p>which configures our REST client to connect to an SSL REST service.</p>
</div>
<div class="paragraph">
<p>Now let&#8217;s build the application as a native executable and run the tests:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">./mvnw clean install -Pnative</code></pre>
</div>
</div>
<div class="paragraph">
<p>And we obtain the following result:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------</code></pre>
</div>
</div>
<div class="paragraph">
<p>So, yes, it appears it works out of the box and this guide is pretty useless.</p>
</div>
<div class="paragraph">
<p>It&#8217;s not. The magic happens when building the native executable:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">[INFO] [io.quarkus.creator.phase.nativeimage.NativeImagePhase] /opt/graalvm/bin/native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dcom.sun.xml.internal.bind.v2.bytecode.ClassTailor.noOptimize=true -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -jar rest-client-1.0-SNAPSHOT-runner.jar -J-Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -H:+PrintAnalysisCallTree -H:EnableURLProtocols=http,https --enable-all-security-services -H:-SpawnIsolates -H:+JNI --no-server -H:-UseServiceLoaderFeature -H:+StackTrace</code></pre>
</div>
</div>
<div class="paragraph">
<p>The important elements are these 3 options:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">-H:EnableURLProtocols=http,https --enable-all-security-services -H:+JNI</code></pre>
</div>
</div>
<div class="paragraph">
<p>They enable the native SSL support for your native executable.</p>
</div>
<div class="paragraph">
<p>As SSL is de facto the standard nowadays, we decided to enable its support automatically for some of our extensions:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>the Agroal connection pooling extension (<code>quarkus-agroal</code>),</p>
</li>
<li>
<p>the Amazon DynamoDB extension (<code>quarkus-amazon-dynamodb</code>),</p>
</li>
<li>
<p>the Hibernate Search Elasticsearch extension (<code>quarkus-hibernate-search-elasticsearch</code>),</p>
</li>
<li>
<p>the Infinispan Client extension (<code>quarkus-infinispan-client</code>).</p>
</li>
<li>
<p>the Jaeger extension (<code>quarkus-jaeger</code>),</p>
</li>
<li>
<p>the JGit extension (<code>quarkus-jgit</code>),</p>
</li>
<li>
<p>the Keycloak extension (<code>quarkus-keycloak</code>),</p>
</li>
<li>
<p>the Kubernetes client extension (<code>quarkus-kubernetes-client</code>),</p>
</li>
<li>
<p>the Mailer extension (<code>quarkus-mailer</code>),</p>
</li>
<li>
<p>the Redis client extension (<code>quarkus-redis-client</code>),</p>
</li>
<li>
<p>the MongoDB extension (<code>quarkus-mongodb-client</code>),</p>
</li>
<li>
<p>the Neo4j extension (<code>quarkus-neo4j</code>),</p>
</li>
<li>
<p>the OAuth2 extension (<code>quarkus-elytron-security-oauth2</code>),</p>
</li>
<li>
<p>the REST client extension (<code>quarkus-rest-client</code>),</p>
</li>
<li>
<p>the Reactive client for PostgreSQL extension (<code>quarkus-reactive-pg-client</code>),</p>
</li>
<li>
<p>the Reactive client for MySQL extension (<code>quarkus-reactive-mysql-client</code>),</p>
</li>
<li>
<p>the Reactive client for DB2 extension (<code>quarkus-reactive-db2-client</code>).</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>As long as you have one of those extensions in your project, the SSL support will be enabled by default.</p>
</div>
<div class="paragraph">
<p>Now, let&#8217;s just check the size of our native executable as it will be useful later:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">$ ls -lh target/rest-client-quickstart-1.0-SNAPSHOT-runner
-rwxrwxr-x. 1 gandrian gandrian 46M Jun 11 13:01 target/rest-client-quickstart-1.0-SNAPSHOT-runner</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="lets-disable-ssl-and-see-how-it-goes"><a class="anchor" href="#lets-disable-ssl-and-see-how-it-goes"></a>Let&#8217;s disable SSL and see how it goes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Quarkus has an option to disable the SSL support entirely.
Why? Because it comes at a certain cost.
So if you are sure you don&#8217;t need it, you can disable it entirely.</p>
</div>
<div class="paragraph">
<p>First, let&#8217;s disable it without changing the REST service URL and see how it goes.</p>
</div>
<div class="paragraph">
<p>Open <code>src/main/resources/application.properties</code> and add the following line:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">quarkus.ssl.native=false</code></pre>
</div>
</div>
<div class="paragraph">
<p>And let&#8217;s try to build again:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">./mvnw clean install -Pnative</code></pre>
</div>
</div>
<div class="paragraph">
<p>The native executable tests will fail with the following error:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">Exception handling request to /country/name/greece: com.oracle.svm.core.jdk.UnsupportedFeatureError: Accessing an URL protocol that was not enabled. The URL protocol https is supported but not enabled by default. It must be enabled by adding the --enable-url-protocols=https option to the native-image command.</code></pre>
</div>
</div>
<div class="paragraph">
<p>This error is the one you obtain when trying to use SSL while it was not explicitly enabled in your native executable.</p>
</div>
<div class="paragraph">
<p>Now, let&#8217;s change the REST service URL to <strong>not</strong> use SSL in <code>src/main/resources/application.properties</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">org.acme.restclient.CountriesService/mp-rest/url=http://restcountries.eu/rest</code></pre>
</div>
</div>
<div class="paragraph">
<p>And build again:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">./mvnw clean install -Pnative</code></pre>
</div>
</div>
<div class="paragraph">
<p>If you check carefully the native executable build options, you can see that the SSL related options are gone:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">[INFO] [io.quarkus.creator.phase.nativeimage.NativeImagePhase] /opt/graalvm/bin/native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dcom.sun.xml.internal.bind.v2.bytecode.ClassTailor.noOptimize=true -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -jar rest-client-1.0-SNAPSHOT-runner.jar -J-Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -H:+PrintAnalysisCallTree -H:EnableURLProtocols=http -H:-SpawnIsolates -H:+JNI --no-server -H:-UseServiceLoaderFeature -H:+StackTrace</code></pre>
</div>
</div>
<div class="paragraph">
<p>And we end up with:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------</code></pre>
</div>
</div>
<div class="paragraph">
<p>You remember we checked the size of the native executable with SSL enabled?
Let&#8217;s check again with SSL support entirely disabled:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">$ ls -lh target/rest-client-quickstart-1.0-SNAPSHOT-runner
-rwxrwxr-x. 1 gandrian gandrian 35M Jun 11 13:06 target/rest-client-quickstart-1.0-SNAPSHOT-runner</code></pre>
</div>
</div>
<div class="paragraph">
<p>Yes, it is now <strong>35 MB</strong> whereas it used to be <strong>46 MB</strong>. SSL comes with a 11 MB overhead in native executable size.</p>
</div>
<div class="paragraph">
<p>And there&#8217;s more to it.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="lets-start-again-with-a-clean-slate"><a class="anchor" href="#lets-start-again-with-a-clean-slate"></a>Let&#8217;s start again with a clean slate</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Let&#8217;s revert the changes we made to the configuration file and go back to SSL with the following command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">git checkout -- src/main/resources/application.properties</code></pre>
</div>
</div>
<div class="paragraph">
<p>And let&#8217;s build the native executable again:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">./mvnw clean install -Pnative</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="the-truststore-path"><a class="anchor" href="#the-truststore-path"></a>The TrustStore path</h2>
<div class="sectionbody">
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title="Warning"></i>
</td>
<td class="content">
<div class="paragraph">
<p>This behavior is new to GraalVM 19.3+.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>When creating a native binary, GraalVM embraces the principle of "immutable security" for the root certificates.
This essentially means that the root certificates are fixed at image build time, based on the certificate configuration used at that build time
(which for Quarkus means when you perform a build having <code>quarkus.package.type=native</code> set).
This avoids shipping a <code>cacerts</code> file or requiring a system property be set in order to set up root
certificates that are provided by the OS where the binary runs.</p>
</div>
<div class="paragraph">
<p>As a consequence, system properties such as <code>javax.net.ssl.trustStore</code> do not have an effect at
run time, so when the defaults need to be changed, these system properties must be provided at image build time.
The easiest way to do so is by setting <code>quarkus.native.additional-build-args</code>. For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">quarkus.native.additional-build-args=-J-Djavax.net.ssl.trustStore=/tmp/mycerts,-J-Djavax.net.ssl.trustStorePassword=changeit</code></pre>
</div>
</div>
<div class="paragraph">
<p>will ensure that the certificates of <code>/tmp/mycerts</code> are baked into the native binary and used <strong>in addition</strong> to the default cacerts.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
<div class="paragraph">
<p>The file containing the custom TrustStore does <strong>not</strong> have to be present at runtime as its content has been baked into the native binary.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="working-with-containers"><a class="anchor" href="#working-with-containers"></a>Working with containers</h3>
<div class="paragraph">
<p>No special action needs to be taken when running the native binary in a container. If the native binary was properly built with the custom TrustStore
as described in the previous section, it will work properly in container as well.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="conclusion"><a class="anchor" href="#conclusion"></a>Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We make building native executable easy and, even if the SSL support in GraalVM is still requiring some serious thinking,
it should be mostly transparent when using Quarkus.</p>
</div>
<div class="paragraph">
<p>We track GraalVM progress on a regular basis so we will promptly integrate in Quarkus any improvement with respect to SSL support.</p>
</div>
</div>
</div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
